package vista;

import java.util.Iterator;
import java.util.Observable;
import java.util.Observer;

import javax.swing.DefaultListModel;

import mapas.Region;
import unidades.Unidad;
import clasesGenerales.Conjunto;
import control.juego.ControladorSeleccion;
import control.mover.BotonMoverListener;
import control.ronda.controladorFinTurno;

/**
 * @author Grupo 2, Algoritmos y programacion 3, Catedra Fontela<br>1er cuat 2007    
 * <br> Esta clase se encarga de representar la vista para realizar movimientos.
 */

public class VistaMover extends VentanaConDosListas implements Observer,CerrablePorFinTurno{

	//Modelo
	private Region regionOrigen;
	private Region regionDestino;
	
	private static String subtitulo1 = "Origen";
	private static String subtitulo2 = "Destino";
	private static String accion = "Mover";
	
	private static VistaMover Instance = null; 
	
	/**
	 * Se encarga de inicializar la vista de movimientos
	 * @param titulo Titulo de la ventana
	 */
	private VistaMover(String titulo){
		//Llamo al constructor del padre
		super(titulo, subtitulo1, subtitulo2, accion);
		//agrego la funcionalidad a los botones
		this.ActivarComportamientoBotonAccion();
		this.ActivarComportamientoBotonSalir();
		//agrego la instancia
		Instance = this;
		// agrego la vista como cerrable por fin de turno
		controladorFinTurno.getInstance().agregarVistaCerrable(this);
	}
	
	/**
	 * Notifica a la vista de los cambios de seleccion de regiones
	 */
	private void ActualizarModelo(){
		String titulo = " - MOVER DESDE ";
		if (regionOrigen != null){
			regionOrigen.deleteObserver(this);
			borrarObservadoresUnidades(regionOrigen);
		}
		if (regionDestino != null){
			regionDestino.deleteObserver(this);
			borrarObservadoresUnidades(regionDestino);
		}
		this.regionOrigen = ControladorSeleccion.GetInstance().getSlot1();
		this.regionDestino = ControladorSeleccion.GetInstance().getSlot2();
		//agrego esta vista como observadora del modelo
		if (regionOrigen!=null){
			regionOrigen.addObserver(this);
			titulo += regionOrigen.getNombre();
		} else
			titulo += "NINGUNA";
		titulo += " HASTA ";
		if (regionDestino!=null){
			regionDestino.addObserver(this);
			titulo += regionDestino.getNombre();
		} else
			titulo += "NINGUNA";
		titulo += " - ";
		this.setTitle(titulo);
		this.update(null,null);
	}
	
	/**
	 * @return Unica intancia de VistaMover
	 */
	public static VistaMover getInstance(){
		if (Instance == null)
			new VistaMover(" - MOVER - ");
		//conecto con el modelo
		Instance.ActualizarModelo();
		return Instance;
	}
	
	/**
	 * Se encarga de actualizar la vista, cuando el modelo cambie
	 */
	public void update(Observable arg0, Object arg1) {
		//Remuevo todos los elementos de las listas
		this.getModelo1().removeAllElements();
		this.getModelo2().removeAllElements();
		//Les cargo todo nuevamente
		if (regionOrigen != null)
			CargarUnidades(this.getModelo1(), regionOrigen);
		if (regionDestino != null)
			CargarUnidades(this.getModelo2(), regionDestino);
	}
	
	/**
	 * Carga las unidades de una region en un modelo de lista
	 * @param modeloLista Modelo donde cargar las unidades
	 * @param region Region que contiene a las unidades
	 */
	private void CargarUnidades(DefaultListModel modeloLista, Region region){
		//Obtengo las unidades
		Conjunto unidades = region.getUnidades();
		//Monto un iterador y recorro los elementos
		Iterator iterador = unidades.iterator();
		while (iterador.hasNext()){
			//Obtengo cada unidad y la agrego al modelo de la lista
			Unidad unidad = (Unidad) iterador.next();
			modeloLista.addElement(unidad);
			unidad.addObserver(this);
		}
	}

	/**
	 * Saca esta vista como observadora de las unidades de una region
	 * @param region Region que contiene a las unidades
	 */
	private void borrarObservadoresUnidades(Region region){
		//Obtengo las unidades
		Conjunto unidades = region.getUnidades();
		//Monto un iterador y recorro los elementos
		Iterator iterador = unidades.iterator();
		while (iterador.hasNext()){
			//Obtengo cada unidad y le saco esta vista como observadora
			Unidad unidad = (Unidad) iterador.next();
			unidad.deleteObserver(this);
		}
	}
	
	/**
	 * @return La region origen
	 */
	public Region getRegionOrigen(){
		return this.regionOrigen;
	}
	
	/**
	 * @return La region destino
	 */
	public Region getRegionDestino(){
		return this.regionDestino;
	}
	
	/**
	 * Activa el comportamiento del boton accion.
	 * Le asigna la accion de mover.
	 */
	protected void ActivarComportamientoBotonAccion(){
		this.getBotonAccion().addActionListener(new BotonMoverListener(this));
	}

	public void CerrarVentana() {
		this.setVisible(false);
	}
}
